#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<assert.h>
int main(int argc,char* argv[])
{
  //.c->exe->load->process->运行->执行我们现在所写的代码
  printf("process is running..\n");
  pid_t id=fork();
  assert(id!=-1);
  if(id==0)
  {
    sleep(1);
    execvp(argv[1],&argv[1]);
     //  execlp("ls","ls","-a","-l",NULL);
     //一个是告诉系统我要执行谁，一个是告诉系统我要怎么执行
     // char* const argv_[]={
     // "ls",
     // "-a",
     //  "-l",
     //   NULL
     // };
     //  execv("/usr/bin/ls",argv_);
     //  execl("./mybin","./mybin");
    char* const envp_[]={
      (char*)"MYENV=11111111222222333344444",
        NULL
    };
    extern char** environ;
    // execle("./mybin","mybin",NULL,envp_);//自定义环境变量
    putenv((char*)"MYENV=444333322221111");//将指定环境变量导入系统中，environ指向的环境变量表
    execle("./mybin","mybin",NULL,environ); //实际上不传，子进程也可以获取
    exit(1);//must failed
  }
  int status=0;
  pid_t ret=waitpid(id,&status,0);
  if(ret>0)printf("wait sucess,exit code:%d,sig:%d\n",(status>>8)&0xFF,status&0x7F);
  //load->exe
  //只要是函数，调用就可能失败
  //exec为什么没有成功返回值？因为不需要,成功了就和接下来的代码没有关系了,判断毫无意义
//  execl("/usr/bin/ls"/*要执行哪一个程序*/,"ls","-a","-l"/*怎样执行*/,NULL);//all exec* end of NULL
  //execl执行后,代码已经全部被覆盖,开始执行新的程序的代码，所以Printf就无法执行了!
// perror("execl");
 // printf("process running done..\n");
 // exit(1);
  return 0;
}
